package com.moss.cloud.common.security.component;

import com.moss.cloud.common.core.constant.Constant;
import com.moss.cloud.common.core.utils.DateUtil;
import org.springframework.stereotype.Component;

/**
 * 基于redis分布式ID生成器
 *
 * @author 瑾年
 * @date 2023年5月30日
 */
@Component
public class RedisIdWorker {
    private final RedisTemplateOps redisTemplateOps;

    public RedisIdWorker(RedisTemplateOps redisTemplateOps) {
        this.redisTemplateOps = redisTemplateOps;
    }

    /**
     * 获取自增ID-16位
     * 000,000,0000000000
     * 3位服务编号，3位业务编号，10位自增序列ID
     *
     * @param serverNo
     * @return
     */
    public String nextId(Integer serverNo, Integer businessNo) {
        Long incrId = redisTemplateOps.incr(Constant.ID_WORK_KEY + serverNo + businessNo, 1);
        return serverNo + businessNo + String.format("%010d", incrId);
    }

    /**
     * 获取订单编号-26位
     * 20230521031610,000,000000000
     * 14位当前时间，3位服务编号，9位自增序列
     *
     * @param serverNo
     * @return
     */
    public String orderId(Integer serverNo) {
        String dateTime = DateUtil.getNow(DateUtil.FORMAT_NO_SLIP);
        Long incrId = redisTemplateOps.incr(Constant.ORDER_WORK_KEY + dateTime + serverNo, 1);
        return dateTime + serverNo + String.format("%09d", incrId);
    }

    /**
     * 流水号-25位
     * 0000000000000,000,000000000
     * 13位时间戳，3位服务编号，9位自增序列
     *
     * @param serverNo
     * @return
     */
    public String traceNo(Integer serverNo) {
        Long incrId = redisTemplateOps.incr(Constant.TRACE_NO_KEY + serverNo, 1);
        return System.currentTimeMillis() + serverNo + String.format("%09d", incrId);
    }
}

